﻿//练习1：编写代码实现：求⼀个整数存储在内存中的⼆进制中1的个数

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

/*
方法一：
>>>当输入一个正整数时，不断的除以2取余，然后再把数除2即可
>>>当遇到负整数时，我们把他从有符号整数变成无符号整数，将数字传过来，然后用unsigned int来接收，
>>>原理：就是把符号的补码变成正的，没有符号位之说
>>>例如“-1”的补码是32个1，所以变成无符号整数后，他就有32个1
*/

//int count_bit_one(unsigned int n)
//{
//	printf("%d\n", n);
//	int count = 0;
//	while (n)
//	{
//		if (n % 2 == 1)
//		{
//			count++;
//		}
//		n /= 2;
//	}
//	return count;
//}

/*
方法二：
>>>我们只用看最后一位是否为1，如果为1则计数加1，为0，则不动，看完最后一位之后，我们用向右移动符移动1位，继续判断
>>>如何判断是否为1呢，用按位与，用给出的数按位与1即可
>>>eg：我们给出-1，用temp接收按位与的结果
		   -1：11111111111111111111111111111111		---补码
			1: 00000000000000000000000000000001		---补码
		 temp：00000000000000000000000000000001		---补码，结果为1
*/

//int count_bit_one(int n)
//{
//	int compare_num = 1;
//	int count = 0;
//	int i = 0;
//	for (i = 0; i < sizeof(n) * 8; i++)
//	{
//		int temp = 0;
//		temp = n>>i & 1;
//		if (temp == 1)
//			count++;
//	}
//	return count;
//}

/*
方法三：n = n & (n - 1)
>>>每次循环都会消掉右边的1，这个公式可以让这个数有几个1，我就循环几次
*/

int count_bit_one(int n)
{
	int count = 0;
	while (n)
	{
		n = n & (n - 1);
		count++;
	}
	return count;
}

int main()
{
	int find_num = 0;
	scanf("%d", &find_num);

	//寻找这个数字二进制中一的个数
	int ret = count_bit_one(find_num);
	printf("%d\n", ret);

	return 0;
}